perm filename FORMAT[D,SYS]4 blob
sn#444019 filedate 1979-05-31 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE FORMAT DOUBLE DENSITY 3330 PACK FORMATTER FOR USE WITH C1 DISK CHANNEL
C00008 00003 DATA AND CONSTANTS
C00012 00004 UUO HANDLER
C00013 00005 HANDLE THE CTY. GETTTY PUTTTY
C00015 00006 UUO ROUTINES READN GETYES
C00017 00007 STRT DDTCAL
C00019 00008 FORMAT ONE TRACK
C00022 00009 BLAST
C00029 ENDMK
C⊗;
TITLE FORMAT DOUBLE DENSITY 3330 PACK FORMATTER FOR USE WITH C1 DISK CHANNEL
FT1DSK←←1 ;SET TO 1 IF ALL DISK DRIVES ARE ON THE SAME CONTROLLER
A←1
B←2
C←3
D←4
E←5
T←14
TT←15
TTT←16
P←17
APR←←0
KLPAG←←10
C1A←←140
C1B←←144
DTE←←200
;KL10 TO CONSOLE
DONG11←←20000 ;RING 11'S DOORBELL
DTFLG←←444 ;DTE20 OPERATION COMPLETE FLAG (RELATIVE TO EPT)
DTF11←←450 ; 10 FROM 11 ARGUMENT
DTCMD←←451 ; TO 11 COMMAND WORD
;CONO C1A BITS
C1SBI←←400000 ;SELECT BUS INTERFACE
C1RSI←←40000 ;RESET INTERFACE
C1SRUN←←10000 ;SET CLOCK RUN
C1CONT←←2000 ;CONTINUE CLOCK
C1SCH←←200000 ;SELECT CHANNEL
C1RST←←40000 ;RESET CHANNEL
C1CCIF←←20000 ;CLEAR CHANNEL INTERRUPT FLAG
C1INTE←←10000 ;INTERRUPT ENABLE
C1INTD←←4000 ;INTERRUPT DISABLE
C1SCF1←←2000 ;SET CF1
C1CCF1←←1000 ;CLEAR CF1
C1MPCN←←400 ;CONTINUE MICROPROCESSOR
C1LCD←←20 ;LOAD CODE FROM BITS 32-35
;BITS 32-35 ARE A CODE, BIT 32 IS OFF FOR "SOFTWARE" CODES:
C1LPT←←11 ;LOAD PROGRAM TABLE STARTING ADDRESS
C1SYSR←←2 ;SYSTEM RESET
C1SCAN←←7 ;SCAN PROGRAM TABLE FOR PROGRAMS TO START
C1SDIA←←100000 ;SELECT DIAGNOSTIC FUNCTIONS
;CONI C1A BITS
C1DCI←←10 ;DISCONNECT IN FROM CU
CIF←←4 ;CHANNEL INTERRUPT FLAG
CF1←←2 ;CHANNEL FLAG 1 (INTERRUPT THE Z80, SET FROM ICH IN CONO)
CF2←←1 ;CHANNEL FLAG 2 (Z80 READY FOR PROGRAM TABLE ADDRESS)
;CHANNEL PROGRAM DEFINITIONS
;LEFT HALF BITS
C1CMD←←100000 ;BITS 0-3 = 10 MEANS (NON-MRT) COMMAND WORD
C1MRT←←040000 ;BITS 0-3 = 04 MEANS MRT COMMAND WORD
C1JMP←←200000 ;BITS 0-3 = 20 MEANS JUMP COMMAND WORD
C1TIO←←020000 ;TEST I/O
C1IWC←←010000 ;IGNORE WORD COUNT
C1BAK←←004000 ;BACKWARDS
C1NATM←←000000 ;NATURAL MODE (MODE IN BITS 7-8)
C1BYTM←←001000 ;BYTE MODE
C1CBYT←←000400 ;COUNT BYTES
;BITS 10-17 ARE THE IBM COMMAND BYTE
;RIGHT HALF BITS
C1SLE←←20 ;STOP ON LENGTH ERROR
C1CEC←←10 ;CHANNEL END CONTINUE
C1NOC←←2 ;NO CHAINING
C1RPT←←1 ;REPEAT UNTIL STATUS MODIFIER IS ON IN ENDING STATUS
;PROGRAM TABLE
C1CCW←←0 ;RELATIVE ADDRESS OF CHANNEL CONTROL WORD
C1ISW←←1 ;INTERRUPT SOURCE WORD
C1PTPE←←100000 ;PARITY ERROR IN PROGRAM TABLE
C1PTNX←←40000 ;NXM IN PROGRAM TABLE
C1IQF←←20000 ;INTERRUPT QUEUE FULL
C1PPTR←←2 ;FIRST PROGRAM POINTER
;PROGRAM HEADER AND PROGRAM
C1PCW←←0 ;RELATIVE ADDRESS OF PROGRAM CONTROL WORD
C1BW←←100 ;BUSY WAIT BIT IN PCW
C1STA←←1 ;STATUS A
;RIGHT HALF BITS
C1HLT←←400000 ;PROGRAM EXECUTED A HALT
C1LE←←200000 ;LENGTH ERROR
C1SE←←100000 ;SELECT ERROR
C1PE←←040000 ;PARITY ERROR
C1NXM←←020000 ;NXM
C1BPE←←010000 ;IBM BUS PARITY ERROR
C1SSE←←002000 ;SIGNAL SEQUENCE ERROR
;LEFT HALF BITS
C1PCMA←←100000 ;1→ERROR POINTER TO BY PC, 0→POINTED TO BY MA
C1STB←←2 ;STATUS B
C1STC←←3 ;STATUS C
C1INST←←4 ;FIRST INSTRUCTION OF CHANNEL PROGRAM
;IBM STATUS BYTE BITS
ATTN←←200
STMOD←←100
CUEND←←40
IBMBSY←←20
CHNEND←←10
DEVEND←←4
UCHK←←2
UXCPTN←←1
;DEVICE ADDRESSES
CUADDR←←6 ;CONTROL UNIT ADDRESS
C1SEEK←←<C1CMD!C1BYTM!C1CBYT!7,,0>
C1SFM←←<C1CMD!C1BYTM!C1CBYT!37,,0>
C1WHAD←←<C1CMD!C1BYTM!C1CBYT!31,,0>
C1WR0←←<C1CMD!C1BYTM!C1CBYT!25,,0>
C1WCKD←←<C1CMD!C1BYTM!C1CBYT!35,,0>
DEFINE C1WCMA (WC,MA)
< BYTE (1)1 (13)WC (22)MA
>
;DATA AND CONSTANTS
EXTERNAL DDT
.LOAD SYS:EDDT.REL
LOC 74
JRST DDT ;KEEP SYMBOLS AROUND
LOC 200
BEGIN: JRST STRT ;DISPATCH TO MAIN LOOP
JRST DDT ;DISPATCH TO DDT
LOC 1000 ;LEAVE ROOM FOR KL10 EPT AT PHYSICAL ZERO
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
SKIPF: 0 ;SET TO -1 TO SKIP RETURN FROM READN
RETLEN←←40
RETBYT←←RETLEN*9/2
RECLEN←←200
RECBYT←←RECLEN*9/2
KEYLEN←←60
KEYBYT←←KEYLEN*9/2 ;PAD RECORD 0 KEY WITH 60 WORDS
NPACKS←←8 ;TOTAL OF 8 PACKS
TRKCYL←←=19
CYLPAC←←=815
MAXTRK←←TRKCYL*CYLPAC-1 ;NUMBER OF TRACKS-1
RCPTRK←←=18
TRACK: 0
DRIVE: 0
PATCH: BLOCK 200 ;PATCH SPACE
PDL: BLOCK 1000
CNT: 0 ;PLACE TO KEEP TRY COUNT
CRLF: BYTE (7) 15,12
;TABLE OF WHICH DRIVE IS ON WHICH CHANNEL, 0 FOR C1A, 1 FOR C1B
C1WCHN:
IFE FT1DSK,<
0
1
0
1
0
1
0
1
>;IFE FT1DSK
IFN FT1DSK,<
1
1
1
1
1
1
1
1
>;IFN FT1DSK
IFN .-C1WCHN-NPACKS,<.FATAL GUESS WHAT YOU FORGOT TO CHANGE>
C1PPTP: C1APT+C1PPTR
C1BPT+C1PPTR
C1CIFI: CONO C1A,C1SCH!C1CCIF ;INST TO CLEAR CIF INDEXED BY CHANNEL NUMBER
CONO C1B,C1SCH!C1CCIF
C1ERR: 0 ;ERROR COUNT
FILMSK: BYTE(8)300 ;PERMIT ALL WRITES
SKDAT: BLOCK 2
SKCYL: POINT 16,SKDAT,31
SKHD: POINT 8,SKDAT+1,15
HADAT: BLOCK 2
HACYL: POINT 16,HADAT,23
HAHD: POINT 8,HADAT+1,7
R0DAT: BLOCK <8+RETBYT+KEYBYT+3>/4
RLEN←←<8+RECBYT+3>/4 ;NUMBER OF WORDS OF STORAGE PER TRACK
R1DAT: BLOCK RCPTRK*RLEN
FRMEND::
W0CYL: POINT 16,R0DAT,15
W0HD: POINT 8,R0DAT,31
W0KL: POINT 8,R0DAT+1,15
W0DL: POINT 16,R0DAT+1,31
WNCYL: POINT 16,R1DAT(TTT),15
WNHD: POINT 8,R1DAT(TTT),31
WNRN: POINT 8,R1DAT+1(TTT),7
WNDL: POINT 16,R1DAT+1(TTT),31
C1ZERO::
C1APT: BLOCK C1PPTR+NPACKS+1 ;CHN CTL WD, INT WD, 1 PGM PTR PER DRIVE, 1 END MARK
C1BPT: BLOCK C1PPTR+NPACKS+1 ;PROGRAM TABLE FOR SECOND CHANNEL
C1PH: BLOCK C1INST ;PROGRAM HEADER
C1ZEND::
C1SEEK ;SEEK COMMAND
C1WCMA 6,SKDAT ;SEEK DATA POINTER
C1SFM ;SET FILE MASK
C1WCMA 1,FILMSK ;PERMIT ALL WRITES
C1WHAD ;WRITE HOME ADDRESS
C1WCMA 5,HADAT ;HOME ADDRESS DATA POINTER
C1WR0 ;WRITE RECORD ZERO
C1WCMA 8+KEYBYT+RETBYT,R0DAT
FOR I←0,RCPTRK-2
< C1WCKD ;WRITE COUNT KEY AND DATA
C1WCMA 8+RECBYT,R1DAT+I*RLEN
>
C1WCKD!C1NOC ;WRITE COUNT KEY AND DATA (UNCHAINED)
C1WCMA 8+RECBYT,R1DAT+<RCPTRK-1>*RLEN
0
;UUO HANDLER
OPDEF PUTCHR[1B8]
OPDEF GETCHR[2B8]
OPDEF OUTSTR[3B8]
OPDEF OCTPNT[4B8]
OPDEF LOCPNT[5B8]
OPDEF DECPNT[6B8]
OPDEF SIXOUT[7B8]
OPDEF ERROR[10B8] ;THIS MUST BE AN LUUO FOR THE KL10
UUOCON: 0
PUSH P,UUOCON ;SAVE THE RETURN ADDRESS
PUSH P,T
PUSH P,TT
PUSH P,TTT
LDB T,[POINT 9,40,8]
CAIL T,UUOLEN
MOVEI T,0
PUSHJ P,@UUODIS(T)
UUORET: POP P,TTT
POP P,TT
POP P,T
POPJ P,
UUODIS: ERR
%PUTCHR
%GETCHR
%OUTSTR
%OCTPNT
%LOCPNT
%DECPNT
%SIXOUT
ERR
UUOLEN←←.-UUODIS
ERR: OUTSTR[ASCIZ/π?
/]
POPJ P,
;HANDLE THE CTY. GETTTY PUTTTY
DTEXX: MOVEM T,DTCMD
SETZM DTFLG ;CLEAR 11'S RESPONSE FLAG
CONO DTE,DONG11 ;RING FOR 11
SKIPN DTFLG ;WAIT FOR RESPONSE
JRST .-1
MOVE T,DTF11 ;GET 11'S RESPONSE WORD
POPJ P,
PUTTTY: PUSH P,T
ANDI T,177
PUSHJ P,DTEXX
POP P,T
POPJ P,
GETTTY: MOVEI T,3400
PUSHJ P,DTEXX
JUMPE T,GETTTY
CAIL T,"a"
CAILE T,"z"
CAIA
SUBI T,40
CAIN T,177 ;RUBOUT?
JRST RUBOUT
PUSHJ P,PUTTTY ;ECHO
CAIE T,15 ;CR?
CAIN T,12
CAIA
POPJ P,
PUSH P,T
TRC T,7 ;CHANGE 15 TO 12 AND VICE VERSA
PUSHJ P,PUTTTY
POP P,T
POPJ P,
RUBOUT: MOVEI T,"X"
PUSHJ P,PUTTTY
MOVEI T,"X"
PUSHJ P,PUTTTY
MOVEI T,"X"
PUSHJ P,PUTTTY
MOVEI T,15
PUSHJ P,PUTTTY
MOVEI T,12
PUSHJ P,PUTTTY
JRST MAIN ;MAIN WILL RESET THE STACK
;UUO ROUTINES READN GETYES
%OUTSTR:HRRZ TT,40 ;GET EFFECTIVE ADDRESS OF UUO
HRLI TT,(<POINT 7,0>)
%OUTS1: ILDB T,TT
JUMPE T,CPOPJ
PUSHJ P,PUTTTY
JRST %OUTS1
%PUTCHR:PUSH P,T
HRRZ T,40
PUSHJ P,PUTTTY
POP P,T
POPJ P,
%GETCHR:PUSH P,T
PUSHJ P,GETTTY
PUSH P,TT
HRRZ TT,40 ;EFFECTIVE ADDRESS OF UUO
MOVEM T,(TT)
POP P,TT
POP P,T
POPJ P,
%OCTPNT:HRRZ TT,40 ;EFFECTIVE ADDRESS OF UUO
MOVE TT,(TT) ;FETCH WORD
MOVEI TTT,=12
OCTLOP: SETZ T,
LSHC T,3
ADDI T,60
PUSHJ P,PUTTTY
SOJG TTT,OCTLOP
POPJ P,
%DECPNT:SKIPA T,[=10]
%LOCPNT:MOVEI T,10
MOVE TT,40
MOVE TT,(TT)
LOCLOP: IDIVI TT,(T)
HRLM TTT,(P)
JUMPE TT,.+2
PUSHJ P,LOCLOP
HLRZ T,(P)
ADDI T,60
JRST PUTTTY
%SIXOUT:MOVE TT,40
MOVE TT,(TT)
SIXOU1: JUMPE TT,CPOPJ
SETZ T,
LSHC T,6
ADDI T,40
PUSHJ P,PUTTTY
JRST SIXOU1
READN: SETZB T,SKIPF ;GET A NUMBER. SKIPS IF NUMBER SEEN
READN1: GETCHR A
CAIL A,"0"
CAILE A,"9"
JRST SKPOPJ ;SKIP OR NOT
IMULI T,=10
ADDI T,-"0"(A)
SETOM SKIPF
JRST READN1
SKPOPJ: SKIPE SKIPF
AOS (P)
POPJ P,
GETYES: OUTSTR [ASCIZ /Go on?/]
GETYS1: GETCHR A
OUTSTR CRLF
CAIN A,"D"
JRST DDTCAL ;GO TO DDT
CAIN A,"Y"
AOS (P)
POPJ P,
;STRT DDTCAL
DDTCAL: OUTSTR [ASCIZ/*DDT*/]
JRST DDT
HUH: OUTSTR [ASCIZ / ???
/]
JRST MAIN
STRT: DATAO KLPAG,[400100,,0] ;START OUT WITH SOME DECENT ACS
CONO KLPAG,0 ;NO CACHE, EPT TO ZERO. NO MAP, NO TRAPS
MOVEI T,-1
MOVEM T,37 ;SET JOBREL FOR DDT.
MOVE T,[JSR UUOCON]
MOVEM T,41
MOVE P,[-1000,,PDL-1]
CONO APR,200000 ;IO RESET
OUTSTR [ASCIZ /
Make sure the KA10 is RESET.
/]
PUSHJ P,BLAST ;CLEAR CHANNEL
MAIN: MOVE P,[-1000,,PDL-1]
PUSHJ P,BLAST
OUTSTR [ASCIZ /Type drive number with pack to format: /]
PUSHJ P,READN
JRST HUH
CAIE A,15
JRST HUH
CAIL T,NPACKS
JRST ILLDRV
MOVEM T,DRIVE
SETZM TRACK
FT0: MOVEI T,5 ;RETRY 5 TIMES IN QUIET MODE
MOVEM T,CNT
FT1: PUSHJ P,FTRACK ;FORMAT TRACK
JRST FLOSE
AOS T,TRACK ;NEXT TRACK
CAIG T,MAXTRK ;GREATER THAN MAXIMUM TRACK NUMBER?
JRST FT0
OUTSTR [ASCIZ /Done, /]
MOVE A,TRACK
DECPNT A
OUTSTR [ASCIZ / tracks formatted.
/]
JRST MAIN
FLOSE: SOSL CNT
JRST FT1
ERROR
OUTSTR [ASCIZ /Format error. /]
PUSHJ P,GETYES
JRST MAIN ;NO
JRST FT1 ;TRY AGAIN, SAME TRACK
ILLDRV: OUTSTR [ASCIZ /Illegal drive number
/]
JRST MAIN
;FORMAT ONE TRACK
FTRACK: SETZM R0DAT
MOVE T,[R0DAT,,R0DAT+1]
BLT T,FRMEND-1
SETZM SKDAT
SETZM SKDAT+1
MOVE T,TRACK
IDIVI T,TRKCYL
DPB T,SKCYL ;SET UP SEEK CYL
DPB TT,SKHD ;AND HEAD
SETZM HADAT
SETZM HADAT+1
DPB T,HACYL
DPB TT,HAHD
DPB T,W0CYL
DPB TT,W0HD
MOVEI B,RETBYT ;NUMBER OF BYTES OF RETRIEVAL
DPB B,W0DL
MOVEI B,KEYBYT ;KEY AREA BYTES (R0 ONLY)
DPB B,W0KL
MOVEI A,1 ;RECORD NUMBER
MOVEI B,RECBYT ;NUMBER OF BYTES/RECORD (DATA AREA - NOT RETRIEVAL)
MOVSI TTT,-RCPTRK
FTRK1: DPB T,WNCYL
DPB TT,WNHD
DPB A,WNRN
DPB B,WNDL
ADDI A,1
ADD TTT,[1,,RLEN]
JUMPL TTT,FTRK1
SETZM C1ERR
MOVE T,DRIVE
MOVE TT,C1WCHN(T) ;C1 CHANNEL NUMBER
DPB T,[POINT 4,@C1PPTP(TT),12] ;STORE DISK DRIVE ADDRESS
MOVEI T,4
DPB T,[POINT 5,@C1PPTP(TT),4] ;STORE START CODE
C1WAIT: JUMPN TT,C1WAIB
CONSO C1A,CIF
JRST .-1
MOVEI T,0
EXCH T,C1APT+C1ISW
C1WAIA: TLC T,200000
TLNE T,600000
JRST C1WERR
MOVE T,C1PH+C1STA ;STATUS A WORD
TRNN T,C1HLT
JRST C1WERR
XCT C1CIFI(TT) ;CLEAR INT FLAG
JRST CPOPJ1
C1WAIB: CONSO C1B,CIF
JRST .-1
MOVEI T,0
EXCH T,C1BPT+C1ISW
JRST C1WAIA
C1WERR: AOS T,C1ERR
CAIL T,=10
POPJ P,
PUSHJ P,BLAST
MOVEI T,4
DPB T,[POINT 5,@C1PPTP(TT),4] ;START C1 AGAIN
JRST C1WAIT
;BLAST
BLAST: CONO C1A,C1SBI!C1RSI!C1SRUN!C1CONT ;RESET ALL CHANNELS START CLOCK
CONO C1A,C1SCH!C1RST!C1MPCN ;RESET CHAN A AND START UP
CONO C1B,C1SCH!C1RST!C1MPCN ;RESET CHAN B AND START UP
CONO C1A,C1SCH!C1SCF1!C1LCD!C1SYSR ;TELL C1A TO DO A SYSTEM RESET
CONSZ C1A,CF1 ;WAIT FOR IT TO DROP CF1
JRST .-1
CONO C1B,C1SCH!C1SCF1!C1LCD!C1SYSR ;TELL C1B TOO
CONSZ C1B,CF1
JRST .-1
CONO C1A,C1SCH!C1SCF1!C1LCD!C1LPT ;INT THE CHANNEL FOR LD ...
CONO C1B,C1SCH!C1SCF1!C1LCD!C1LPT ;...PGM TABLE.
SETZM C1ZERO
MOVE T,[C1ZERO,,C1ZERO+1]
BLT T,C1ZEND-1
MOVEI T,253 ;HAS TO BE 253 (THE CHANNEL CHECKS)
MOVEM T,C1APT+C1CCW
MOVEM T,C1BPT+C1CCW
MOVEI T,C1BW ;BUSY WAIT BIT
MOVEM T,C1PH
MOVE T,[BYTE (5)37 (8)CUADDR⊗4 (1)0 (22)C1PH]
MOVEM T,C1APT+C1PPTR ;STORE PROGRAM POINTER IN PROGRAM TABLE
MOVE T,[BYTE (5)37 (8)<CUADDR+1>⊗4 (1)0 (22)C1PH]
MOVEM T,C1BPT+C1PPTR
CONSO C1A,CF2 ;WAIT FOR CHANNEL TO BE READY FOR PGM TBL
JRST .-1
DATAO C1A,[C1APT] ;TELL IT WHERE THE PROGRAM TABLE IS
CONO C1A,C1SCH!C1CCF1 ;CLEAR CF1 (TELL IT WE'VE TOLD IT)
CONSZ C1A,CF2 ;WAIT FOR CHANNEL TO DROP CF2
JRST .-1
CONSO C1B,CF2 ;REPEAT FOR SECOND CHANNEL
JRST .-1
DATAO C1B,[C1BPT]
CONO C1B,C1SCH!C1CCF1
CONSZ C1B,CF2
JRST .-1
POPJ P,
END STRT